class OperacaoController {
    
    def index = { redirect(action:list,params:params) }

    // the delete, save and update actions only accept POST requests
    def allowedMethods = [delete:'POST', /*save:'POST',*/ update:'POST']

    def list = {
        if(!params.max) params.max = 10
        if(!params.sort) {
            params.sort = 'dataOperacao'
            params.order = 'asc'
        }
        [ operacaoList: Operacao.list( params ) ]
    }

    def show = {
        if(!params.id)
        redirect(action:list)
			
        def operacao = Operacao.get( params.id )

        if(!operacao) {
            flash.message = "Operacao not found with id ${params.id}"
            redirect(action:list)
        }
        else { return [ operacao : operacao ] }
    }

    def delete = {
        def operacao = Operacao.get( params.id )
        if(operacao) {
            operacao.delete()
            flash.message = "Operacao ${params.id} deleted"
            redirect(action:list)
        }
        else {
            flash.message = "Operacao not found with id ${params.id}"
            redirect(action:list)
        }
    }

    def edit = {
        def operacao = Operacao.get( params.id )

        if(!operacao) {
            flash.message = "Operacao not found with id ${params.id}"
            redirect(action:list)
        }
        else {
            return [ operacao : operacao ]
        }
    }

    def update = {
        def operacao = Operacao.get( params.id )
        if(operacao) {
            operacao.properties = params
            if(!operacao.hasErrors() && operacao.save()) {
                flash.message = "Operacao ${params.id} updated"
                redirect(action:show,id:operacao.id)
            }
            else {
                render(view:'edit',model:[operacao:operacao])
            }
        }
        else {
            flash.message = "Operacao not found with id ${params.id}"
            redirect(action:edit,id:params.id)
        }
    }

    def create = {
        def operacao = new Operacao()
        operacao.properties = params
        return ['operacao':operacao, cheque: new Cheque(), emitente:new Emitente(), contaCorrente:new ContaCorrente()]
    }

    def save = {
        def operacao = new Operacao(params['operacao'])
        def cheque = new Cheque(params['cheque'])
        def emitente = new Emitente(params['emitente'])
        def contaCorrente = new ContaCorrente(params['contaCorrente'])
        def cliente = new Cliente(params['contaCorrente'])
		
		
		
        if(params['id'])
          operacao = Operacao.get(params['id'])
        else{
            println '-------------'
            def criteria = Taxa.createCriteria();
            operacao.taxas = criteria{               
                    le("inicioVigencia", operacao.dataOperacao)
                    or{
                      ge("fimVigencia", operacao.dataOperacao)
                      isNull("fimVigencia")
                    }                                                       
            }
        }
        
        operacao.taxas.each{
            println it
        }
		
        def emitenteAux = Emitente.findByCpf(emitente.cpf)
        if(emitenteAux)
          emitente = emitenteAux
			
        def criteria = ContaCorrente.createCriteria();
        def contaAuxList = criteria {
            eq("numero", contaCorrente.numero)
            eq("agencia", contaCorrente.agencia)
            eq("banco", contaCorrente.banco)
        }
        if(!contaAuxList.isEmpty())
          contaCorrente = contaAuxList[0]
			
        emitente.conta = contaCorrente
        
        def criteria2 = Emitente.createCriteria();
        def emitenteAuxList = criteria2 {
            eq("cpf", emitente.cpf)
        }
        
        if(!emitenteAuxList.isEmpty())
          emitente = emitenteAuxList[0]
        cheque.emitente = emitente
		
        if(!cheque.operacao) 
          cheque.operacao = operacao
	
        cheque.validate()
        emitente.validate()
        contaCorrente.validate()
                
        
			
        if(!emitente.hasErrors() && !cheque.hasErrors() && !operacao.hasErrors() && operacao.save()) {
            flash.message = "Cheque número ${cheque.numero} (R\$ ${cheque.valor}) adicionado"
            operacao.addToCheques(cheque)
			
            render(view:'create', model:['operacao':operacao, cheque:cheque, emitente:emitente, contaCorrente:contaCorrente])
        }
        else {
            operacao.validate()
            render(view:'create', model:['operacao':operacao, cheque:cheque, emitente:emitente, contaCorrente:contaCorrente])
        }
    }
	
    def finalize = {
	
    }
}